package com.raymond.http.config;

import io.netty.channel.pool.ChannelHealthChecker;
import io.netty.handler.logging.LogLevel;
import io.netty.util.internal.SystemPropertyUtil;
import lombok.Data;

/**
 * http连接配置信息
 *
 * @author :  raymond
 * @version :  V1.0
 * @date :  2021-12-11 15:13
 */
@Data
public class HttpConfig {
    /**
     * 连接超长时间
     */
    private Integer connectTimeOutMillis = 10000;

    /**
     * 读取数据超时
     */
    private Integer soTimeout = 10000;

    /**
     * 每个目的地址的最大边接数,一般默认cpu倍数个，不能太大，影响效率，建议为cpu两倍
     * 默认最大连接数为cpu核数的2倍;
     */
    private Integer maxConnections = 32;
    /**
     * 最大Content长度
     */
    private Integer maxContentLength = SystemPropertyUtil.getInt("io.netty.maxContentLength", 65536);

    /**
     * 日志级别
     */
    private LogLevel logLevel = LogLevel.INFO;

    /**
     * tcp是否延迟
     * tcp是否不等待有数据立即发送
     */
    private Boolean tcpNodeLazy = Boolean.TRUE;

    /**
     * 是否保持长连接
     */
    private Boolean soKeepAlive = Boolean.TRUE;

    /**
     * 长连接读取的心跳时长，超过此时长断开连接
     */
    private Integer readerIdleTimeSeconds = 20;

    /**
     * 长连接写的心跳时长，超过此时长断开连接
     */
    private Integer writerIdleTimeSeconds = 20;

    /**
     * 长连接读+写总合心跳时长，超长此时长则断开连接
     */
    private Integer allIdleTimeSeconds = 40;

    //////////////////////////////以下配置默认，请慎重修改//////////////////////////////
    /**
     * 指从连接池获取连接的timeout超出预设时间
     * 默认3秒没获取到连接则返回连接异常
     */
    private Long connectionRequestTimeout = 3000L;

    /**
     * healthCheck 健康检查：检测所有非活跃的连接，即只保留活跃的连接
     * ChannelHealthChecker，从ChannelPool获取时，将用于检查通道是否仍然健康
     */
    private ChannelHealthChecker healthCheck = ChannelHealthChecker.ACTIVE;
    /**
     * releaseHealthCheck 是否进行连接释放的健康检查。
     * 如果此参数设置为true，将在返回之前检查通道健康状况
     */
    private boolean releaseHealthCheck = true;
    /**
     * true将是后进先出LIFO，如果false则是先进先出FIFO。
     */
    private boolean lastRecentUsed = true;

}
